<?php
	
	/* Cette classe permet de gerer la partie du directeur des etudes
	 * cad calculer la moyenne des etudiants d'une formation, obtenir le
	 * classement etc...
	 */
	
	error_reporting(E_ALL);
	ini_set('display_errors', true);
	
	include_once "gestionnaireEtuMoy.php";
	include_once "inc/defines.php";
	
	class gestionnaireDDE {
		private $db;
		
		public function __construct() {
			$this->db = new PDO(SERVER.":host=".HOST.";dbname=".BASE, USER, PASS);
		}
		
		public function getGlobalStatistics() {
			//on recupere les ID de tous les etudiants qui sont dans les formations dont le DDE acces pour en faire un classement par moyenne
			$sqlQuery = "SELECT id_etud, nom, prenom, login, nom_grptp, nom_grptd FROM ".ETUDIANT_TABLE." LEFT JOIN ".GRP_TP_TABLE." ON ".ETUDIANT_TABLE.".id_grptp=".GRP_TP_TABLE.".id_grptp LEFT JOIN ".GRP_TD_TABLE." ON ".GRP_TP_TABLE.".id_grptd=".GRP_TD_TABLE.".id_grptd LEFT JOIN ".SEMESTRE_TABLE." ON ".GRP_TD_TABLE.".id_sem=".SEMESTRE_TABLE.".id_sem LEFT JOIN ".FORM_TABLE." ON ".SEMESTRE_TABLE.".id_form=".FORM_TABLE.".id_form WHERE ".FORM_TABLE.".id_form IN (SELECT id_form from ".SUIT_TABLE." WHERE id_dde=(SELECT id_dde FROM ".DDE_TABLE." WHERE login=\"".$_SESSION["login"]."\"));";
			$st = $this->db->prepare($sqlQuery);
			$this->getSummary($st, MOY_GENERALE, null);
		}
		
		public function getFormationStatistics($id_form) {
			//on recupere les ID de tous les etudiants qui sont dans la formation (reecrire avec des constantes plz)
			$sqlQuery = "select id_etud, nom, prenom, login, nom_grptp, nom_grptd FROM Etudiant left join Groupe_TP ON Etudiant.id_grptp=Groupe_TP.id_grptp left join Groupe_TD ON Groupe_TP.id_grptd=Groupe_TD.id_grptd left join Semestre ON Groupe_TD.id_sem=Semestre.id_sem left join Formation ON Semestre.id_form=Formation.id_form where Formation.id_form=".$id_form.";";
			$st = $this->db->prepare($sqlQuery);
			$this->getSummary($st, MOY_GENERALE, null);
		}
		
		public function getSemestreStatistics($id_sem) {
			//on recupere les ID de tous les etudiants qui sont dans le semestre
			$sqlQuery = "select id_etud, nom, prenom, login, nom_grptp, nom_grptd FROM Etudiant left join Groupe_TP ON Etudiant.id_grptp=Groupe_TP.id_grptp left join Groupe_TD ON Groupe_TP.id_grptd=Groupe_TD.id_grptd left join Semestre ON Groupe_TD.id_sem=Semestre.id_sem where Semestre.id_sem=".$id_sem.";";
			$st = $this->db->prepare($sqlQuery);
			$this->getSummary($st, MOY_GENERALE, null);
		}
		
		public function getUEStatistics($id_ue) {
			//on regarde d'abord dans quel semestre est cette UE
			$sqlQuery = "SELECT id_sem FROM ".UE_TABLE." WHERE id_ue=".$id_ue.";";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			$ligne = $st->fetch(PDO::FETCH_ASSOC);
			$id_sem = $ligne["id_sem"];
			//pareil que pour les stats d'un semestre sauf qu'on va demander la moyenne sur l'UE (MOY_UE)
			$sqlQuery = "select id_etud, nom, prenom, login, nom_grptp, nom_grptd FROM Etudiant left join Groupe_TP ON Etudiant.id_grptp=Groupe_TP.id_grptp left join Groupe_TD ON Groupe_TP.id_grptd=Groupe_TD.id_grptd left join Semestre ON Groupe_TD.id_sem=Semestre.id_sem where Semestre.id_sem=".$id_sem.";";
			$st = $this->db->prepare($sqlQuery);
			$this->getSummary($st, MOY_UE, $id_ue);
		}
		
		public function getModuleStatistics($id_module) {
			//on regarde d'abord dans quel semestre est ce module
			$sqlQuery = "SELECT id_sem FROM ".MODULE_TABLE." LEFT JOIN ".UE_TABLE." ON ".MODULE_TABLE.".id_ue=".UE_TABLE.".id_ue WHERE id_module=".$id_module.";";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			$ligne = $st->fetch(PDO::FETCH_ASSOC);
			$id_sem = $ligne["id_sem"];
			//pareil que pour les stats d'un semestre sauf qu'on va demander la moyenne sur le module (MOY_MODULE)
			$sqlQuery = "select id_etud, nom, prenom, login, nom_grptp, nom_grptd FROM Etudiant left join Groupe_TP ON Etudiant.id_grptp=Groupe_TP.id_grptp left join Groupe_TD ON Groupe_TP.id_grptd=Groupe_TD.id_grptd left join Semestre ON Groupe_TD.id_sem=Semestre.id_sem where Semestre.id_sem=".$id_sem.";";
			$st = $this->db->prepare($sqlQuery);
			$this->getSummary($st, MOY_MODULE, $id_module);
		}
		
		public function getExamStatistics($id_exam) {
			//on regarde d'abord dans quel semestre est cet examen
			$sqlQuery = "select id_sem from ".EXAM_TABLE." left join ".MODULE_TABLE." on ".EXAM_TABLE.".id_module=".MODULE_TABLE.".id_module left join ".UE_TABLE." ON ".MODULE_TABLE.".id_ue=".UE_TABLE.".id_ue where id_examen=".$id_exam.";";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			$ligne = $st->fetch(PDO::FETCH_ASSOC);
			$id_sem = $ligne["id_sem"];
			//pareil que pour les stats d'un semestre sauf qu'on va demander la moyenne sur l'examen (MOY_EXAM)
			$sqlQuery = "select id_etud, nom, prenom, login, nom_grptp, nom_grptd FROM Etudiant left join Groupe_TP ON Etudiant.id_grptp=Groupe_TP.id_grptp left join Groupe_TD ON Groupe_TP.id_grptd=Groupe_TD.id_grptd left join Semestre ON Groupe_TD.id_sem=Semestre.id_sem where Semestre.id_sem=".$id_sem.";";
			$st = $this->db->prepare($sqlQuery);
			$this->getSummary($st, MOY_EXAM, $id_exam);
		}
		
		public function getSummary($st, $moyType, $id) {
			$st->execute();
			$moyEtudiants = array();
			if(isset($_SESSION["tdfilter"]))
				$tdfilter = $_SESSION["tdfilter"];
			else
				$tdfilter = "Tous";
			if(isset($_SESSION["tpfilter"]))
				$tpfilter = $_SESSION["tpfilter"];
			else
				$tpfilter = "Tous";
			echo "<script type=\"text/javascript\">";
			echo "window.onload = function populate() {"; //cette fonction recupere les groupes TP depuis le tableau et les ajoute dans le selecteur
			echo "var table = document.getElementById('t');";
			echo "var select = document.getElementById('grptp');";
			echo "var groupes = [];";
			echo "var option;";
			echo "for(var i = 1, row; row = table.rows[i]; i++) {"; //on commence a 1 car a 0 on est sur les titres des colonnes
			echo "if($.inArray(row.cells[2].innerHTML, groupes) == -1) groupes.push(row.cells[2].innerHTML);";
			echo "}";
			echo "for(var i = 0; i < groupes.length; i++) {";
			echo "option = document.createElement('option');";
			echo "option.value = groupes[i];";
			echo "option.innerHTML = groupes[i];";
			echo "if(groupes[i] == '".$tpfilter."') {";
			echo "option.selected = true;";
			echo "}";
			echo "select.appendChild(option);}";
			
			echo "select = document.getElementById('grptd');";
			echo "groupes = [];";
			echo "for(var i = 1, row; row = table.rows[i]; i++) {"; //on commence a 1 car a 0 on est sur les titres des colonnes
			echo "if($.inArray(row.cells[1].innerHTML, groupes) == -1) groupes.push(row.cells[1].innerHTML);";
			echo "}";
			echo "for(var i = 0; i < groupes.length; i++) {";
			echo "option = document.createElement('option');";
			echo "option.value = groupes[i];";
			echo "option.innerHTML = groupes[i];";
			echo "if(groupes[i] == '".$tdfilter."') {";
			echo "option.selected = true;";
			echo "}";
			echo "select.appendChild(option);}";
			
			echo "}</script>";
			echo "<div class=\"alignRight small\"><form class=\"right\" style=\"margin-left:10px;\" id=\"filterTP\" action=\"../../php/dofilter.php\" method=\"post\"><label>Groupe TP : </label><select id=\"grptp\" name=\"grptp\" onchange=\"document.getElementById('filterTP').submit()\"><option>Tous</option></select></form><form id=\"filterTD\" action=\"../../php/dofilter.php\" method=\"post\"><label>Groupe TD : </label><select id=\"grptd\" name=\"grptd\" onchange=\"document.getElementById('filterTD').submit()\"><option>Tous</option></select></form></div><br>";
			$code = "<fieldset><table class=\"ddeTable\" id=\"t\">";
			$code .= "<tr><td class=\"ddeCell expand columnLabel bold\">Etudiant</td><td class=\"ddeCell shrink columnLabel bold\">Groupe TD</td><td class=\"ddeCell shrink columnLabel bold\">Groupe TP</td><td class=\"ddeCell shrink columnLabel bold\">Moyenne</td><td class=\"ddeCell shrink columnLabel bold\">Rang</td></tr>";
			while($ligne = $st->fetch(PDO::FETCH_ASSOC)) {
				$g = new gestionnaireEtuMoy($ligne["id_etud"]);
				switch($moyType) {
					case MOY_GENERALE:
						$moy = $g->getEtuMoy(false);
						break;
					case MOY_UE:
						$moy = $g->getUEMoy($id, false);
						break;
					case MOY_MODULE:
						$moy = $g->getModuleMoy($id, false);
						break;
					case MOY_EXAM:
						$moy = $g->getExamNote($id, false);
						break;
				}
				if($moy != null) {
					if(($tdfilter == "Tous" && ($tpfilter == "Tous" || $tpfilter == $ligne["nom_grptp"])) || $tpfilter == "Tous" && ($tdfilter == "Tous" || $tdfilter == $ligne["nom_grptd"])) {
						$key = "<tr class=\"ddeRow\"><td class=\"ddeCell expand\">".$ligne["nom"]." ".$ligne["prenom"]." (<a href=\"JavaScript:void(window.open('etuviewer.php?login=".$ligne["login"]."', 'popUpWindow','height=768,width=1024,left=0,top=0,resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,location=no,directories=no,status=yes'));\">".$ligne["login"]."</a>)</td><td class=\"ddeCell shrink center\">".$ligne["nom_grptd"]."</td><td class=\"ddeCell shrink center\">".$ligne["nom_grptp"]."</td>";
						$moyEtudiants[$key] = $moy;
					}
				}
			}
			unset($_SESSION["tpfilter"]); //pour que la selection du groupe ne soit pas persistente sur le changement de page (entrainerait des bugs de groupes non-presents sur la page par exemple)
			unset($_SESSION["tdfilter"]);
			arsort($moyEtudiants); //voir http://php.net/manual/en/function.arsort.php
			$rang = 1;
			foreach($moyEtudiants as $nom => $moyenne) {
				$code .= $nom."<td class=\"ddeCell shrink center\">".$moyenne."</td><td class=\"ddeCell shrink center\">".$rang."</td></tr>";
				$rang++;
			}
			$code .= "</table></fieldset><br><br>";
			$code .= "<table class=\"ddeTable\">";
			$code .= "<tr class=\"ddeRow\"><td class=\"ddeCell expand bold\">Moyenne :</td><td class=\"ddeCell shrink\">".(count($moyEtudiants) != 0 ? round(array_sum($moyEtudiants) / count($moyEtudiants), 2) : "")."</td></tr>";
			$code .= "<tr class=\"ddeRow\"><td class=\"ddeCell expand bold\">Moyenne maximale :</td><td class=\"ddeCell shrink\">".(count($moyEtudiants) != 0 ? max($moyEtudiants) : "")."</td></tr>";
			$code .= "<tr class=\"ddeRow\"><td class=\"ddeCell expand bold\">Moyenne minimale :</td><td class=\"ddeCell shrink\">".(count($moyEtudiants) != 0 ? min($moyEtudiants) : "")."</td></tr>";
			$code .= "<tr class=\"ddeRow\"><td class=\"ddeCell expand bold\">Ecart-type :</td><td class=\"ddeCell shrink\">".(count($moyEtudiants) != 0 ? round($this->sd($moyEtudiants), 2) : "")."</td></tr>";
			$code .= "</table>";
			echo $code;
		}
		
		private function sd($aValues) { //fonction piochee sur stackoverflow: http://stackoverflow.com/a/15477221
			$fMean = array_sum($aValues) / count($aValues);
			$fVariance = 0.0;
			foreach($aValues as $i)
				$fVariance += pow($i - $fMean, 2);
			$size = count($aValues) - 1;
			if($size > 0)
				return (float)(sqrt($fVariance) / sqrt($size));
			else
				return 0;
		}
	}
	
?>
